Prepare county level data

Read and format prevalence data


df_us_covid <- read_csv('timeseries_usa_county_march1_april_09.csv')

df_us_covid <- df_us_covid %>% 
  filter(time <=31) %>% 
  arrange(countyfips) %>%
  mutate(stabil = -stabil) %>%
  dplyr::rename(county_fips = countyfips,
         pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = stabil)


df_us_covid <- df_us_covid %>% 
  dplyr::select(county_fips, time, mark, rate_day, pers_o,
                pers_c, pers_e, pers_a, pers_n)


df_us_covid %>% head()

Conty level controls


df_us_ctrl <- read.csv('controls_US.csv')

df_us_ctrl <- df_us_ctrl %>% select(-county_name) %>% 
  rename(county_fips = county)

df_us_ctrl %>% head()
NA

Social distancing data unacast


df_us_socdist <- read_csv('0409_sds-full-county.csv')

# create sequence of dates
date_sequence <- seq.Date(as.Date('2020-03-09'),
                          as.Date('2020-03-31'), 1)
                     

# create data frame with time sequence
df_dates = tibble(date_sequence, 1:length(date_sequence)) 
names(df_dates) <- c('date', 'time')

# merge day index with gps data
df_us_socdist = df_us_socdist %>% 
  merge(df_dates, by='date') %>% 
  arrange(county_fips) %>%
  as_tibble()

df_us_socdist %>% head()

Social distancing data FB


fb_files <- list.files('../FB Data/US individual files/Mobility/',
                       '*.csv', full.names = T)

df_us_socdist_fb <- fb_files %>% 
  map(read_csv) %>% bind_rows()

df_us_socdist_fb <- df_us_socdist_fb %>%
  select(-age_bracket, -gender, -baseline_name, -baseline_type) %>%
  rename(date = ds,
         county_fips = polygon_id,
         county_name = polygon_name,
         socdist_tiles = all_day_bing_tiles_visited_relative_change,
         socdist_single_tile = all_day_ratio_single_tile_users)

df_us_socdist_fb <- df_us_socdist_fb %>%
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>%
  group_by(county_fips) %>% 
  arrange(date) %>% 
  mutate(time = row_number()) %>%
  ungroup() %>% 
  arrange(county_fips)

head(df_us_socdist_fb)

Sanity check socdist data

socdist <- df_us_socdist %>% merge(df_us_socdist_fb, by = c("county_fips", "time")) 

socdist[c('daily_distance_diff', 'daily_visitation_diff', 'socdist_tiles', 'socdist_single_tile')] %>% 
  cor(use = 'pairwise.complete')
                      daily_distance_diff daily_visitation_diff socdist_tiles socdist_single_tile
daily_distance_diff             1.0000000             0.1361318     0.3061683          -0.2746350
daily_visitation_diff           0.1361318             1.0000000     0.3826102          -0.3624062
socdist_tiles                   0.3061683             0.3826102     1.0000000          -0.7544123
socdist_single_tile            -0.2746350            -0.3624062    -0.7544123           1.0000000

Merge data


df_us <- plyr::join_all(list(df_us_covid, df_us_socdist_fb),
                  by = c('county_fips', 'time'), 
                  type = 'inner') %>% 
  plyr::join(df_us_ctrl, by='county_fips') %>% 
  arrange(county_fips, time)

df_us %>% head()
NA

Explore data

Plot distributions


# distribution of observations per county
df_us %>% group_by(county_fips) %>% 
  summarise(mark = mean(mark)) %>% 
  ggplot(aes(x=mark)) + 
  geom_histogram(color="black", fill="white", binwidth = 300) +
  ggtitle('Distribution of observations per county')


  
# distributions of mean prevalence rates per county
df_us %>% group_by(county_fips) %>% 
  summarise(rate_day = mean(rate_day)) %>%
  ggplot(aes(x=rate_day)) + 
  geom_histogram(color="black", fill="white", binwidth = 0.01) +
  ggtitle('Distribution of mean prevalence rates by county')


  
# distribution of mean sd distance measue
df_us %>% group_by(county_fips) %>% 
  summarise(socdist_tiles = mean(socdist_tiles)) %>%
  ggplot(aes(x=socdist_tiles)) + 
  geom_histogram(color="black", fill="white", bins = 200) +
 ggtitle('Distribution of mean tiles visited measure by county')



# distribution of mean sd visit measue
df_us %>% group_by(county_fips) %>% 
  summarise(socdist_single_tile = mean(socdist_single_tile)) %>%
  ggplot(aes(x=socdist_single_tile)) + 
  geom_histogram(color="black", fill="white", bins = 200) +
  ggtitle('Distribution of mean single tile measute by county')

NA
NA

Plot social distancing single tile visited


df_us %>% sample_n(10000) %>%
  ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=county_name, size=mark)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_us %>% mutate(dist_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.05), quantile(.[[i]], 0.95), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(dist_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=county_name, size=mark)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~dist_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot prevalence over time


df_us %>% sample_n(20000) %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=county_name, size=mark)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")




pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_us %>% mutate(prev_tail = cut(.[[i]], 
                                       breaks = c(-Inf, quantile(.[[i]], 0.05), quantile(.[[i]], 0.95), Inf),
                                       labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=county_name, size=mark)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Correlations


df_us %>% select(-time, -date, -county_name) %>% 
  group_by(county_fips) %>%
  summarize_if(is.numeric, mean) %>% 
  select(-county_fips) %>%
  cor(use='pairwise.complete.obs') %>% 
  round(3)
                      mark rate_day pers_o pers_c pers_e pers_a pers_n socdist_tiles socdist_single_tile
mark                 1.000    0.189  0.279 -0.052  0.097 -0.041 -0.174        -0.377               0.214
rate_day             0.189    1.000  0.196 -0.049  0.044 -0.037 -0.094        -0.240               0.167
pers_o               0.279    0.196  1.000 -0.052 -0.086 -0.154 -0.228        -0.249               0.208
pers_c              -0.052   -0.049 -0.052  1.000  0.148  0.650 -0.402         0.165              -0.258
pers_e               0.097    0.044 -0.086  0.148  1.000  0.235 -0.386        -0.065              -0.061
pers_a              -0.041   -0.037 -0.154  0.650  0.235  1.000 -0.384         0.123              -0.277
pers_n              -0.174   -0.094 -0.228 -0.402 -0.386 -0.384  1.000         0.062               0.190
socdist_tiles       -0.377   -0.240 -0.249  0.165 -0.065  0.123  0.062         1.000              -0.595
socdist_single_tile  0.214    0.167  0.208 -0.258 -0.061 -0.277  0.190        -0.595               1.000
airport_distance    -0.212   -0.055 -0.093 -0.094 -0.109 -0.103  0.040         0.258              -0.135
republican          -0.345   -0.234 -0.349 -0.046 -0.077 -0.086  0.307         0.350              -0.231
medage              -0.223   -0.075 -0.034 -0.066 -0.092 -0.074  0.232         0.013               0.301
male                -0.115   -0.052 -0.117 -0.096 -0.058 -0.154  0.054         0.126              -0.041
popdens              0.322    0.375  0.222 -0.044  0.028 -0.070 -0.044        -0.244               0.221
manufact            -0.162   -0.138 -0.386  0.070  0.034  0.119  0.179         0.057              -0.126
tourism              0.112    0.111  0.368  0.017 -0.003 -0.067 -0.188        -0.006               0.074
academics            0.418    0.284  0.462 -0.116  0.141 -0.145 -0.341        -0.434               0.259
medinc               0.307    0.228  0.226 -0.173  0.134 -0.219 -0.215        -0.444               0.225
physician_pc        -0.181   -0.100 -0.213  0.107 -0.047  0.112  0.117         0.163              -0.114
                    airport_distance republican medage   male popdens manufact tourism academics medinc
mark                          -0.212     -0.345 -0.223 -0.115   0.322   -0.162   0.112     0.418  0.307
rate_day                      -0.055     -0.234 -0.075 -0.052   0.375   -0.138   0.111     0.284  0.228
pers_o                        -0.093     -0.349 -0.034 -0.117   0.222   -0.386   0.368     0.462  0.226
pers_c                        -0.094     -0.046 -0.066 -0.096  -0.044    0.070   0.017    -0.116 -0.173
pers_e                        -0.109     -0.077 -0.092 -0.058   0.028    0.034  -0.003     0.141  0.134
pers_a                        -0.103     -0.086 -0.074 -0.154  -0.070    0.119  -0.067    -0.145 -0.219
pers_n                         0.040      0.307  0.232  0.054  -0.044    0.179  -0.188    -0.341 -0.215
socdist_tiles                  0.258      0.350  0.013  0.126  -0.244    0.057  -0.006    -0.434 -0.444
socdist_single_tile           -0.135     -0.231  0.301 -0.041   0.221   -0.126   0.074     0.259  0.225
airport_distance               1.000      0.121  0.029  0.194  -0.144   -0.138   0.101    -0.133 -0.177
republican                     0.121      1.000  0.134  0.162  -0.264    0.172  -0.220    -0.452 -0.192
medage                         0.029      0.134  1.000 -0.040  -0.105    0.091  -0.080    -0.210 -0.107
male                           0.194      0.162 -0.040  1.000  -0.101   -0.080  -0.046    -0.175 -0.004
popdens                       -0.144     -0.264 -0.105 -0.101   1.000   -0.120   0.049     0.242  0.154
manufact                      -0.138      0.172  0.091 -0.080  -0.120    1.000  -0.380    -0.385 -0.179
tourism                        0.101     -0.220 -0.080 -0.046   0.049   -0.380   1.000     0.279 -0.022
academics                     -0.133     -0.452 -0.210 -0.175   0.242   -0.385   0.279     1.000  0.719
medinc                        -0.177     -0.192 -0.107 -0.004   0.154   -0.179  -0.022     0.719  1.000
physician_pc                  -0.038      0.196  0.078  0.159  -0.079    0.157  -0.226    -0.369 -0.202
                    physician_pc
mark                      -0.181
rate_day                  -0.100
pers_o                    -0.213
pers_c                     0.107
pers_e                    -0.047
pers_a                     0.112
pers_n                     0.117
socdist_tiles              0.163
socdist_single_tile       -0.114
airport_distance          -0.038
republican                 0.196
medage                     0.078
male                       0.159
popdens                   -0.079
manufact                   0.157
tourism                   -0.226
academics                 -0.369
medinc                    -0.202
physician_pc               1.000
  

Model building

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, rate_day, all_of(y))
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Rescale Data


lvl2_scaled <- df_us %>% 
  select(-time, -mark, -date, -county_name, -rate_day,
         -socdist_tiles, -socdist_single_tile) %>% 
  distinct() %>% 
  mutate_at(vars(-county_fips), scale)

lvl1_scaled <- df_us %>% select(county_fips, time, rate_day, socdist_single_tile) %>% 
  mutate_at(vars(-county_fips, -time), scale)


df_us_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')

head(df_us_scaled)

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness


models_o_sd <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'prev')

extract_results(models_o_sd)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_o_sd)
NA
NA

social distancing ~ conscientiousness


models_c_sd <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'county_fips', 
                         data = df_us_scaled,
                         ctrls = 'prev')

extract_results(models_c_sd)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_c_sd)
NA
NA

social distancing ~ extraversion

social distancing ~ agreeableness

social distancing ~ neuroticism

Create overview table

Define function to create overview tables

Create overview tables

Conditional random forest analysis

Extract slopes


# slope prevalence
df_us_slope_prev <- df_us %>% split(.$county) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('county_fips') %>% 
  rename(slope_prev = '.')

df_us_slope_prev <- df_us %>% select(county_fips:pers_n) %>%
  distinct() %>% 
  mutate(county_fips = as.character(county_fips)) %>%
  inner_join(df_us_slope_prev, by = 'county_fips') %>%
  select(-viocrime, -assn2014, -sk2014, -trade_element_share,
       -manag_share, -patents, -married_share, -purewhite_share,
       -lifeexp_2010_14, -male_share, -creative_share, -rep2008, 
       -dem2008, -other2008, -totalpop, -population)


# slope social distancing
df_us_slope_socdist <- df_us %>% split(.$county) %>% 
  map(~ lm(socdist_tiles ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('county_fips') %>% 
  rename(slope_socdist = '.')

df_us_slope_socdist <- df_us %>% select(county_fips:pers_n) %>%
  distinct() %>% 
  mutate(county_fips = as.character(county_fips)) %>%
  inner_join(df_us_slope_socdist, by = 'county_fips') %>%
  select(-viocrime, -assn2014, -sk2014, -trade_element_share,
         -manag_share, -patents, -married_share, -purewhite_share,
         -lifeexp_2010_14, -male_share, -creative_share, -rep2008, 
         -dem2008, -other2008, -totalpop, -population)

Explore distribution of slopes

df_us_slopes_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)

df_us_slopes_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

CRF prevalence


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_fit_prev <- cforest(slope_prev ~ ., 
                         df_us_slope_prev[-1], 
                         controls = ctrls)

crf_varimp_prev <- varimp(crf_fit_prev, nperm = 5)
crf_varimp_cond_prev <- varimp(crf_fit_prev, conditional = T)

crf_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_fit_socdist <- cforest(slope_socdist ~ ., 
                         df_us_slope_socdist[-1], 
                         controls = ctrls)

crf_varimp_socdist <- varimp(crf_fit_socdist, nperm = 5)
crf_varimp_cond_socdist <- varimp(crf_fit_socdist, conditional = T)

crf_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))
LS0tCnRpdGxlOiAiQ09WSUQtMTkgVVMiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMTUvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VUycpCgpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCmxpYnJhcnkoZG9QYXJhbGxlbCkKCgoKYGBgCgoKIyBQcmVwYXJlIGNvdW50eSBsZXZlbCBkYXRhIAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBwcmV2YWxlbmNlIGRhdGEgCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZGZfdXNfY292aWQgPC0gcmVhZF9jc3YoJ3RpbWVzZXJpZXNfdXNhX2NvdW50eV9tYXJjaDFfYXByaWxfMDkuY3N2JykKCmRmX3VzX2NvdmlkIDwtIGRmX3VzX2NvdmlkICU+JSAKICBmaWx0ZXIodGltZSA8PTMxKSAlPiUgCiAgYXJyYW5nZShjb3VudHlmaXBzKSAlPiUKICBtdXRhdGUoc3RhYmlsID0gLXN0YWJpbCkgJT4lCiAgZHBseXI6OnJlbmFtZShjb3VudHlfZmlwcyA9IGNvdW50eWZpcHMsCiAgICAgICAgIHBlcnNfbyA9IG9wZW4sIAogICAgICAgICBwZXJzX2MgPSBzY2ksCiAgICAgICAgIHBlcnNfZSA9IGV4dHJhLAogICAgICAgICBwZXJzX2EgPSBhZ3JlZSwKICAgICAgICAgcGVyc19uID0gc3RhYmlsKQoKCmRmX3VzX2NvdmlkIDwtIGRmX3VzX2NvdmlkICU+JSAKICBkcGx5cjo6c2VsZWN0KGNvdW50eV9maXBzLCB0aW1lLCBtYXJrLCByYXRlX2RheSwgcGVyc19vLAogICAgICAgICAgICAgICAgcGVyc19jLCBwZXJzX2UsIHBlcnNfYSwgcGVyc19uKQoKCmRmX3VzX2NvdmlkICU+JSBoZWFkKCkKYGBgCgojIyMgQ29udHkgbGV2ZWwgY29udHJvbHMgCmBgYHtyfQoKZGZfdXNfY3RybCA8LSByZWFkLmNzdignY29udHJvbHNfVVMuY3N2JykKCmRmX3VzX2N0cmwgPC0gZGZfdXNfY3RybCAlPiUgc2VsZWN0KC1jb3VudHlfbmFtZSkgJT4lIAogIHJlbmFtZShjb3VudHlfZmlwcyA9IGNvdW50eSkKCmRmX3VzX2N0cmwgJT4lIGhlYWQoKQoKYGBgCgoKIyMjIFNvY2lhbCBkaXN0YW5jaW5nIGRhdGEgdW5hY2FzdApgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmRmX3VzX3NvY2Rpc3QgPC0gcmVhZF9jc3YoJzA0MDlfc2RzLWZ1bGwtY291bnR5LmNzdicpCgojIGNyZWF0ZSBzZXF1ZW5jZSBvZiBkYXRlcwpkYXRlX3NlcXVlbmNlIDwtIHNlcS5EYXRlKGFzLkRhdGUoJzIwMjAtMDMtMDknKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5EYXRlKCcyMDIwLTAzLTMxJyksIDEpCiAgICAgICAgICAgICAgICAgICAgIAoKIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIHRpbWUgc2VxdWVuY2UKZGZfZGF0ZXMgPSB0aWJibGUoZGF0ZV9zZXF1ZW5jZSwgMTpsZW5ndGgoZGF0ZV9zZXF1ZW5jZSkpIApuYW1lcyhkZl9kYXRlcykgPC0gYygnZGF0ZScsICd0aW1lJykKCiMgbWVyZ2UgZGF5IGluZGV4IHdpdGggZ3BzIGRhdGEKZGZfdXNfc29jZGlzdCA9IGRmX3VzX3NvY2Rpc3QgJT4lIAogIG1lcmdlKGRmX2RhdGVzLCBieT0nZGF0ZScpICU+JSAKICBhcnJhbmdlKGNvdW50eV9maXBzKSAlPiUKICBhc190aWJibGUoKQoKZGZfdXNfc29jZGlzdCAlPiUgaGVhZCgpCmBgYAoKCiMjIyBTb2NpYWwgZGlzdGFuY2luZyBkYXRhIEZCCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZmJfZmlsZXMgPC0gbGlzdC5maWxlcygnLi4vRkIgRGF0YS9VUyBpbmRpdmlkdWFsIGZpbGVzL01vYmlsaXR5LycsCiAgICAgICAgICAgICAgICAgICAgICAgJyouY3N2JywgZnVsbC5uYW1lcyA9IFQpCgpkZl91c19zb2NkaXN0X2ZiIDwtIGZiX2ZpbGVzICU+JSAKICBtYXAocmVhZF9jc3YpICU+JSBiaW5kX3Jvd3MoKQoKZGZfdXNfc29jZGlzdF9mYiA8LSBkZl91c19zb2NkaXN0X2ZiICU+JQogIHNlbGVjdCgtYWdlX2JyYWNrZXQsIC1nZW5kZXIsIC1iYXNlbGluZV9uYW1lLCAtYmFzZWxpbmVfdHlwZSkgJT4lCiAgcmVuYW1lKGRhdGUgPSBkcywKICAgICAgICAgY291bnR5X2ZpcHMgPSBwb2x5Z29uX2lkLAogICAgICAgICBjb3VudHlfbmFtZSA9IHBvbHlnb25fbmFtZSwKICAgICAgICAgc29jZGlzdF90aWxlcyA9IGFsbF9kYXlfYmluZ190aWxlc192aXNpdGVkX3JlbGF0aXZlX2NoYW5nZSwKICAgICAgICAgc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpCgpkZl91c19zb2NkaXN0X2ZiIDwtIGRmX3VzX3NvY2Rpc3RfZmIgJT4lCiAgZmlsdGVyKGRhdGUgPj0gJzIwMjAtMDMtMDknICYgZGF0ZSA8PSAnMjAyMC0wMy0zMScpICU+JQogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgYXJyYW5nZShkYXRlKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcykKCmhlYWQoZGZfdXNfc29jZGlzdF9mYikKYGBgCgojIyMgU2FuaXR5IGNoZWNrIHNvY2Rpc3QgZGF0YQpgYGB7cn0Kc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JSBtZXJnZShkZl91c19zb2NkaXN0X2ZiLCBieSA9IGMoImNvdW50eV9maXBzIiwgInRpbWUiKSkgCgpzb2NkaXN0W2MoJ2RhaWx5X2Rpc3RhbmNlX2RpZmYnLCAnZGFpbHlfdmlzaXRhdGlvbl9kaWZmJywgJ3NvY2Rpc3RfdGlsZXMnLCAnc29jZGlzdF9zaW5nbGVfdGlsZScpXSAlPiUgCiAgY29yKHVzZSA9ICdwYWlyd2lzZS5jb21wbGV0ZScpCgpgYGAKCgojIyMgTWVyZ2UgZGF0YQpgYGB7cn0KCmRmX3VzIDwtIHBseXI6OmpvaW5fYWxsKGxpc3QoZGZfdXNfY292aWQsIGRmX3VzX3NvY2Rpc3RfZmIpLAogICAgICAgICAgICAgICAgICBieSA9IGMoJ2NvdW50eV9maXBzJywgJ3RpbWUnKSwgCiAgICAgICAgICAgICAgICAgIHR5cGUgPSAnaW5uZXInKSAlPiUgCiAgcGx5cjo6am9pbihkZl91c19jdHJsLCBieT0nY291bnR5X2ZpcHMnKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcywgdGltZSkKCmRmX3VzICU+JSBoZWFkKCkKCmBgYAoKIyMgRXhwbG9yZSBkYXRhCiMjIyBQbG90IGRpc3RyaWJ1dGlvbnMKYGBge3IsIHdhcm5pbmc9RkFMU0V9CgojIGRpc3RyaWJ1dGlvbiBvZiBvYnNlcnZhdGlvbnMgcGVyIGNvdW50eQpkZl91cyAlPiUgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBzdW1tYXJpc2UobWFyayA9IG1lYW4obWFyaykpICU+JSAKICBnZ3Bsb3QoYWVzKHg9bWFyaykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0id2hpdGUiLCBiaW53aWR0aCA9IDMwMCkgKwogIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiBvYnNlcnZhdGlvbnMgcGVyIGNvdW50eScpCgogIAojIGRpc3RyaWJ1dGlvbnMgb2YgbWVhbiBwcmV2YWxlbmNlIHJhdGVzIHBlciBjb3VudHkKZGZfdXMgJT4lIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUgCiAgc3VtbWFyaXNlKHJhdGVfZGF5ID0gbWVhbihyYXRlX2RheSkpICU+JQogIGdncGxvdChhZXMoeD1yYXRlX2RheSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD0id2hpdGUiLCBiaW53aWR0aCA9IDAuMDEpICsKICBnZ3RpdGxlKCdEaXN0cmlidXRpb24gb2YgbWVhbiBwcmV2YWxlbmNlIHJhdGVzIGJ5IGNvdW50eScpCgogIAojIGRpc3RyaWJ1dGlvbiBvZiBtZWFuIHNkIGRpc3RhbmNlIG1lYXN1ZQpkZl91cyAlPiUgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBzdW1tYXJpc2Uoc29jZGlzdF90aWxlcyA9IG1lYW4oc29jZGlzdF90aWxlcykpICU+JQogIGdncGxvdChhZXMoeD1zb2NkaXN0X3RpbGVzKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPSJ3aGl0ZSIsIGJpbnMgPSAyMDApICsKIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiBtZWFuIHRpbGVzIHZpc2l0ZWQgbWVhc3VyZSBieSBjb3VudHknKQoKCiMgZGlzdHJpYnV0aW9uIG9mIG1lYW4gc2QgdmlzaXQgbWVhc3VlCmRmX3VzICU+JSBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIHN1bW1hcmlzZShzb2NkaXN0X3NpbmdsZV90aWxlID0gbWVhbihzb2NkaXN0X3NpbmdsZV90aWxlKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9IndoaXRlIiwgYmlucyA9IDIwMCkgKwogIGdndGl0bGUoJ0Rpc3RyaWJ1dGlvbiBvZiBtZWFuIHNpbmdsZSB0aWxlIG1lYXN1dGUgYnkgY291bnR5JykKCgpgYGAKCgojIyMgUGxvdCBzb2NpYWwgZGlzdGFuY2luZyBzaW5nbGUgdGlsZSB2aXNpdGVkCmBgYHtyfQoKZGZfdXMgJT4lIHNhbXBsZV9uKDEwMDAwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X25hbWUsIHNpemU9bWFyaykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk92ZXJhbGwgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUiKQoKcGVycyA8LSBjKCdwZXJzX28nLCAncGVyc19jJywgJ3BlcnNfZScsICdwZXJzX2EnLCAncGVyc19uJykKCmZvciAoaSBpbiBwZXJzKXsKCmdnIDwtIGRmX3VzICU+JSBtdXRhdGUoZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjA1KSwgcXVhbnRpbGUoLltbaV1dLCAwLjk1KSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihkaXN0X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfbmFtZSwgc2l6ZT1tYXJrKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5kaXN0X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCgojIyMgUGxvdCBwcmV2YWxlbmNlIG92ZXIgdGltZQpgYGB7cn0KCmRmX3VzICU+JSBzYW1wbGVfbigyMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfbmFtZSwgc2l6ZT1tYXJrKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBwcmV2YWxlbmNlIG92ZXIgdGltZSIpCgoKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91cyAlPiUgbXV0YXRlKHByZXZfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4wNSksIHF1YW50aWxlKC5bW2ldXSwgMC45NSksIEluZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9uYW1lLCBzaXplPW1hcmspKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZShpKQoKcHJpbnQoZ2cpCn0KCmBgYAoKCiMjIyBDb3JyZWxhdGlvbnMgCgpgYGB7cn0KCmRmX3VzICU+JSBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtY291bnR5X25hbWUpICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWNvdW50eV9maXBzKSAlPiUKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZS5vYnMnKSAlPiUgCiAgcm91bmQoMykKICAKYGBgCgoKIyBNb2RlbCBidWlsZGluZwoKIyMgUHJlcGFyZSBmdW5jdGlvbnMKCmBgYHtyfQoKIyBmdW5jdGlvbiBjYWxjdWxhdGVzIGFsbCByZWxldmFudCBtb2RlbHMKcnVuX21vZGVscyA8LSBmdW5jdGlvbih5LCBsdmwxX3gsIGx2bDJfeCwgbHZsMl9pZCwgZGF0YSwgY3RybHM9Ril7CgogICMgc3Vic2V0IGRhdGEKICBkYXRhID0gZGF0YSAlPiUgCiAgICBkcGx5cjo6c2VsZWN0KGFsbF9vZih5KSwgYWxsX29mKGx2bDFfeCksIGFsbF9vZihsdmwyX3gpLCBhbGxfb2YobHZsMl9pZCksIAogICAgICAgICAgICAgICAgICBwb3BkZW5zLCByYXRlX2RheSwgYWxsX29mKHkpKQogIGRhdGEgPSBkYXRhICU+JSAKICAgIGRwbHlyOjpyZW5hbWUoeSA9IGFsbF9vZih5KSwKICAgICAgICAgICBsdmwxX3ggPSBhbGxfb2YobHZsMV94KSwKICAgICAgICAgICBsdmwyX3ggPSBhbGxfb2YobHZsMl94KSwKICAgICAgICAgICBsdmwyX2lkID0gYWxsX29mKGx2bDJfaWQpCiAgICAgICAgICAgKQogIAogICMgY29uZmlndXJlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUKICBjdHJsX2NvbmZpZyA8LSBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScsIG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCkKCiAgIyBiYXNlbGluZQogIGJhc2VsaW5lIDwtIGxtZShmaXhlZCA9IHkgfiAxLCByYW5kb20gPSB+IDEgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgcmFuZG9tIGludGVyY2VwdCBmaXhlZCBzbG9wZQogIHJhbmRvbV9pbnRlcmNlcHQgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAxIHwgbHZsMl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbikKICAKICAKICBpZiAoY3RybHMgPT0gJ2RlbScgfCBjdHJscyA9PSAncHJldicpewogICAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9kZW0gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCArIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBsdmwxX3ggKiBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKSAgICAgICAgCiAgICAKICAgICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX2RlbSIgPSByYW5kb21fc2xvcGVfY3RybF9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSkKICB9CiAgCiAgaWYgKGN0cmxzID09ICdwcmV2Jyl7CiAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9wcmV2IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3ggKyBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogICAgCiAgICAgICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfaW50X3ByZXY8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgbHZsMV94ICogcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogICAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9kZW0iID0gcmFuZG9tX3Nsb3BlX2N0cmxfZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0sICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfcHJldiIgPSByYW5kb21fc2xvcGVfY3RybF9wcmV2LAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2KQogIH0KICAKICBpZihjdHJscyA9PSAnZXhwJyl7CiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSAqIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogIAogIAogICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLCAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2V4cCIgPSByYW5kb21fc2xvcGVfZXhwLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fZXhwIiA9IGludGVyYWN0aW9uX2V4cCkKICB9CiAgCiAgcmV0dXJuKHJlc3VsdHMpCiAgICAgICAgCn0KCiMgZXh0cmFjdHMgdGFibGUgd2l0aCBjb2VmZmljaWVudHMgYW5kIHRlc3RzIHN0YXRpc3RpY3MKZXh0cmFjdF9yZXN1bHRzIDwtIGZ1bmN0aW9uKG1vZGVscykgewogIAogIG1vZGVsc19zdW1tYXJ5IDwtIG1vZGVscyAlPiUgCiAgbWFwKHN1bW1hcnkpICU+JSAKICBtYXAoInRUYWJsZSIpICU+JSAKICBtYXAoYXMuZGF0YS5mcmFtZSkgJT4lIAogIG1hcChyb3VuZCwgMTApIAogICMgJT4lIG1hcCh+IC5bc3RyX2RldGVjdChyb3duYW1lcyguKSwgJ0ludGVyfGx2bCcpLF0pCiAgCiAgcmV0dXJuKG1vZGVsc19zdW1tYXJ5KQogIAp9CgoKY29tcGFyZV9tb2RlbHMgPC0gZnVuY3Rpb24obW9kZWxzKSB7CgogIG1kbF9uYW1lcyA8LSBtb2RlbHMgJT4lIG5hbWVzKCkKICAKICBzdHIgPSAnJwogIGZvciAoaSBpbiBtZGxfbmFtZXMpewogICAgCiAgICBtZGxfc3RyIDwtIHBhc3RlKCdtb2RlbHMkJywgaSwgc2VwID0gJycpCiAgICAKICAgIGlmKGkgPT0gJ2Jhc2VsaW5lJyl7CiAgICAgIHN0ciA8LSBtZGxfc3RyCiAgICB9ZWxzZXsKICAgIHN0ciA8LSBwYXN0ZShzdHIsIG1kbF9zdHIsIHNlcD0nLCAnKQogICAgfQogIH0KICAKICBhbm92YV9zdHIgPC0gcGFzdGUwKCdhbm92YSgnLCBzdHIsICcpJykKICBtZGxfY29tcCA8LSBldmFsKHBhcnNlKHRleHQ9YW5vdmFfc3RyKSkKICByb3duYW1lcyhtZGxfY29tcCkgPSBtZGxfbmFtZXMKICByZXR1cm4obWRsX2NvbXApCn0KCgpgYGAKCiMjIFJlc2NhbGUgRGF0YQpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX3VzICU+JSAKICBzZWxlY3QoLXRpbWUsIC1tYXJrLCAtZGF0ZSwgLWNvdW50eV9uYW1lLCAtcmF0ZV9kYXksCiAgICAgICAgIC1zb2NkaXN0X3RpbGVzLCAtc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1jb3VudHlfZmlwcyksIHNjYWxlKQoKbHZsMV9zY2FsZWQgPC0gZGZfdXMgJT4lIHNlbGVjdChjb3VudHlfZmlwcywgdGltZSwgcmF0ZV9kYXksIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpICU+JSAKICBtdXRhdGVfYXQodmFycygtY291bnR5X2ZpcHMsIC10aW1lKSwgc2NhbGUpCgoKZGZfdXNfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWQsIGx2bDJfc2NhbGVkLCBieSA9ICdjb3VudHlfZmlwcycpCgpoZWFkKGRmX3VzX3NjYWxlZCkKYGBgCgoKIyMgUHJlZGljdCBwcmV2YWxlbmNlCiMjIyBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19vJywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnY291bnR5X2ZpcHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfb19jb3ZpZCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCm1vZGVsc19jX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdjb3VudHlfZmlwcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2VfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2NvdW50eV9maXBzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19lX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2FfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2NvdW50eV9maXBzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfYV9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCm1vZGVsc19uX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdjb3VudHlfZmlwcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9jb3ZpZCkKCgpgYGAKCgojIyBQcmVkaWN0IHNvY2lhbCBkaXN0YW5jaW5nCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IG9wZW5uZXNzCmBgYHtyfQoKbW9kZWxzX29fc2QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnY291bnR5X2ZpcHMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19zZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX3NkKQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19zZCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdjb3VudHlfZmlwcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19jX3NkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Nfc2QpCgoKYGBgCgojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBleHRyYXZlcnNpb24KYGBge3J9Cgptb2RlbHNfZV9zZCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdjb3VudHlfZmlwcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19lX3NkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Vfc2QpCgoKYGBgCgojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2Ffc2QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAnY291bnR5X2ZpcHMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfYV9zZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX3NkKQoKCmBgYAoKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9zZCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdjb3VudHlfZmlwcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19uX3NkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fc2QpCgpgYGAKCgojIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGUgCgojIyMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CgpzdW1tYXJ5X3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVscywgZHZfbmFtZSl7CgogIHRlbXBfZGZfY3RybF9tYWluIDwtIE5VTEwKICB0ZW1wX2RmX2N0cmxfaW50IDwtIE5VTEwKICAKICBmb3IgKGkgaW4gbW9kZWxzKXsKICAgIHJlc3VsdHMgPC0gaSAlPiUgZXh0cmFjdF9yZXN1bHRzKCkKICAgIAogICAgcmVzdWx0c19jdHJsX21haW4gPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtWydsdmwxX3g6bHZsMl94JyxdCiAgICB0ZW1wX2RmX2N0cmxfbWFpbiA8LSB0ZW1wX2RmX2N0cmxfbWFpbiAlPiUgcmJpbmQocmVzdWx0c19jdHJsX21haW4pCiAgICAKICAgIHJlc3VsdHNfY3RybF9pbnQgPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW1bJ2x2bDFfeDpsdmwyX3gnLF0KICAgIHRlbXBfZGZfY3RybF9pbnQgPC0gdGVtcF9kZl9jdHJsX2ludCAlPiUgcmJpbmQocmVzdWx0c19jdHJsX2ludCkKICB9CiAgCiAgbmFtZXNfY3RybF9tYWluIDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucycpCiAgbmFtZXNfY3RybF9pbnQgPC0gcGFzdGUwKGR2X25hbWUsICd+JywgYygnbycsICdjJywgJ2UnLCAnYScsICduJyksICcqdGltZScsICdfY3J0bF9wb3BkZW5zKnRpbWUnKQoKICByb3duYW1lcyh0ZW1wX2RmX2N0cmxfbWFpbikgPC0gbmFtZXNfY3RybF9tYWluCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludCkgPC0gbmFtZXNfY3RybF9pbnQKICAKICBzdW1fdGFiIDwtIHJiaW5kKHRlbXBfZGZfY3RybF9tYWluLCB0ZW1wX2RmX2N0cmxfaW50KSAlPiUgcm91bmQoNCkKICAKICByZXR1cm4oc3VtX3RhYikKCn0gCgpgYGAKCiMjIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGVzCmBgYHtyfQojIHByZXZhbGVuY2UKbW9kZWxzX3ByZXYgPC0gbGlzdChtb2RlbHNfb19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2NfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX25fY292aWQpCgpzdW1fdGFiX3ByZXYgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfcHJldiwgZHZfbmFtZSA9ICdwcmV2JykKCndyaXRlLnRhYmxlKHN1bV90YWJfcHJldiwgcXVvdGU9RikKCiMgc29jaWFsIGRpc3RhbmNpbmcKbW9kZWxzX3NvY2Rpc3QgPC0gbGlzdChtb2RlbHNfb19zZCwgCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2Nfc2QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX3NkLCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9zZCwgCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxzX25fc2QpCgpzdW1fdGFiX3NvY2Rpc3QgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfc29jZGlzdCwgZHZfbmFtZSA9ICdzb2NkaXN0JykKCndyaXRlLnRhYmxlKHN1bV90YWJfc29jZGlzdCwgcXVvdGU9RikKCgpgYGAKCgoKCiMgQ29uZGl0aW9uYWwgcmFuZG9tIGZvcmVzdCBhbmFseXNpcyAKCiMjIyBFeHRyYWN0IHNsb3BlcwpgYGB7cn0KCiMgc2xvcGUgcHJldmFsZW5jZQpkZl91c19zbG9wZV9wcmV2IDwtIGRmX3VzICU+JSBzcGxpdCguJGNvdW50eSkgJT4lIAogIG1hcCh+IGxtKHJhdGVfZGF5IH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykgJT4lIAogIHJlbmFtZShzbG9wZV9wcmV2ID0gJy4nKQoKZGZfdXNfc2xvcGVfcHJldiA8LSBkZl91cyAlPiUgc2VsZWN0KGNvdW50eV9maXBzOnBlcnNfbikgJT4lCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkgJT4lCiAgaW5uZXJfam9pbihkZl91c19zbG9wZV9wcmV2LCBieSA9ICdjb3VudHlfZmlwcycpICU+JQogIHNlbGVjdCgtdmlvY3JpbWUsIC1hc3NuMjAxNCwgLXNrMjAxNCwgLXRyYWRlX2VsZW1lbnRfc2hhcmUsCiAgICAgICAtbWFuYWdfc2hhcmUsIC1wYXRlbnRzLCAtbWFycmllZF9zaGFyZSwgLXB1cmV3aGl0ZV9zaGFyZSwKICAgICAgIC1saWZlZXhwXzIwMTBfMTQsIC1tYWxlX3NoYXJlLCAtY3JlYXRpdmVfc2hhcmUsIC1yZXAyMDA4LCAKICAgICAgIC1kZW0yMDA4LCAtb3RoZXIyMDA4LCAtdG90YWxwb3AsIC1wb3B1bGF0aW9uKQoKCiMgc2xvcGUgc29jaWFsIGRpc3RhbmNpbmcKZGZfdXNfc2xvcGVfc29jZGlzdCA8LSBkZl91cyAlPiUgc3BsaXQoLiRjb3VudHkpICU+JSAKICBtYXAofiBsbShzb2NkaXN0X3RpbGVzIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lIAogIG1hcF9kYmwoJ3RpbWUnKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykgJT4lIAogIHJlbmFtZShzbG9wZV9zb2NkaXN0ID0gJy4nKQoKZGZfdXNfc2xvcGVfc29jZGlzdCA8LSBkZl91cyAlPiUgc2VsZWN0KGNvdW50eV9maXBzOnBlcnNfbikgJT4lCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkgJT4lCiAgaW5uZXJfam9pbihkZl91c19zbG9wZV9zb2NkaXN0LCBieSA9ICdjb3VudHlfZmlwcycpICU+JQogIHNlbGVjdCgtdmlvY3JpbWUsIC1hc3NuMjAxNCwgLXNrMjAxNCwgLXRyYWRlX2VsZW1lbnRfc2hhcmUsCiAgICAgICAgIC1tYW5hZ19zaGFyZSwgLXBhdGVudHMsIC1tYXJyaWVkX3NoYXJlLCAtcHVyZXdoaXRlX3NoYXJlLAogICAgICAgICAtbGlmZWV4cF8yMDEwXzE0LCAtbWFsZV9zaGFyZSwgLWNyZWF0aXZlX3NoYXJlLCAtcmVwMjAwOCwgCiAgICAgICAgIC1kZW0yMDA4LCAtb3RoZXIyMDA4LCAtdG90YWxwb3AsIC1wb3B1bGF0aW9uKQoKYGBgCgojIyMgRXhwbG9yZSBkaXN0cmlidXRpb24gb2Ygc2xvcGVzCmBgYHtyfQpkZl91c19zbG9wZXNfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKZGZfdXNfc2xvcGVzX3NvY2Rpc3QgJT4lIGdncGxvdChhZXMoc2xvcGVfc29jZGlzdCkpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKCmBgYAoKIyBDUkYgcHJldmFsZW5jZQpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gLiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl91c19zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfZml0X3ByZXYsIG5wZXJtID0gNSkKY3JmX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9maXRfcHJldiwgY29uZGl0aW9uYWwgPSBUKQoKY3JmX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl92YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IC4sIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfdXNfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl92YXJpbXBfc29jZGlzdCA8LSB2YXJpbXAoY3JmX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfZml0X3NvY2Rpc3QsIGNvbmRpdGlvbmFsID0gVCkKCmNyZl92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfdmFyaW1wX2NvbmRfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGA=